package com.efrei.schoolmanager.tools;

import java.awt.Component;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

import javax.swing.JOptionPane;

import com.efrei.schoolmanager.exceptions.LogicException;

/**
 * fonctions outils à utiliser dans modéles/vues/controleurs
 * 
 * @author pierrick
 */
public class Tools {

	/**
	 * separateur par défaut
	 */
	public static final String SEPARATEUR_FR = "/";

	private Tools() {
	}

	/**
	 * @param date
	 *            de la forme jour/mois/année
	 * @param separateur
	 * @return une date ou exception
	 * @throws LogicException
	 * @throws IllegalArgumentException
	 *             chaine non valide
	 */
	public static Date getDate(String date, String separateur)
			throws LogicException {
		String error = "date invalide (format jour/mois/année attendu)";

		Verifs.checkString(date, error);
		try {
			// recuperation de la date
			String membres[] = date.split(separateur);
			if (membres.length != 3)
				throw new IllegalArgumentException();
			// affectation avec trim pour enlever les espaces superflus
			return new GregorianCalendar(Integer.valueOf(membres[2].trim()),
					Integer.valueOf(membres[1].trim()),
					Integer.valueOf(membres[0].trim())).getTime();
		} catch (Exception e) {
			throw new LogicException(error);
		}
	}

	/**
	 * retourne le nom du mois pour la periode donnée
	 * 
	 * @param periode
	 *            1 - 12
	 * @return chaine associée à la période
	 */
	public static String getMoisParPeriode(int periode) {
		switch (periode) {
		case 1:
			return "Septembre";
		case 2:
			return "Octobre";
		case 3:
			return "Novembre";
		case 4:
			return "Decembre";
		case 5:
			return "Janvier";
		case 6:
			return "Fevrier";
		case 7:
			return "Mars";
		case 8:
			return "Avril";
		case 9:
			return "Mai";
		case 10:
			return "Juin";
		case 11:
			return "Juillet";
		case 12:
			return "Aout";
		default:
			return "Inconnu";
		}
	}

	/**
	 * retourne la version courte (3 caractères) pour getMoisParPeriode
	 * 
	 * @see #getMoisParPeriode(int)
	 */
	public static String getMoisCourtParPeriode(int periode) {
		return Tools.getMoisParPeriode(periode).substring(0, 3);
	}

	/**
	 * @return numéro de la période selon le mois courant
	 * @see #getMoisParPeriode(int)
	 * @see #getMoisCourtParPeriode(int)
	 */
	public static int getPeriodeCourante() {
		Calendar now = Calendar.getInstance();
		// janvier = 0 donc
		// > 7 => -7 pour que septembre = 1
		// < 7 => +5 pour que janvier = 5
		int month = now.get(Calendar.MONTH);
		return month > 7 ? (month - 7) : (month + 5);
	}

	/**
	 * @param message
	 * @param title
	 * @see #displayError(Component, Object, String)
	 */
	public static void displayError(Object message, String title) {
		displayError(null, message, title);
	}

	/**
	 * affiche une erreur à l'utilisateur
	 * 
	 * @param message
	 * @param title
	 * @param parentComponent
	 */
	public static void displayError(Component parentComponent, Object message,
			String title) {
		JOptionPane.showMessageDialog(parentComponent, message, title,
				JOptionPane.ERROR_MESSAGE);
	}

	/**
	 * @param message
	 * @param title
	 * @see #displayInformation(Component, Object, String)
	 */
	public static void displayInformation(Object message, String title) {
		displayInformation(null, message, title);
	}

	/**
	 * affiche une information a l'utilisateur
	 * 
	 * @param parentComponent
	 * @param message
	 * @param title
	 */
	public static void displayInformation(Component parentComponent,
			Object message, String title) {
		JOptionPane.showMessageDialog(null, message, title,
				JOptionPane.INFORMATION_MESSAGE);
	}

	/**
	 * retourne la chaine correspondant a la date fournise
	 * 
	 * @param date
	 * @param sep
	 * @return
	 */
	public static String dateToString(Date date, String sep) {
		Calendar calendar = new GregorianCalendar();
		calendar.setTime(date);

		return new StringBuilder().append(calendar.get(Calendar.DAY_OF_WEEK))
				.append(sep).append(calendar.get(Calendar.MONTH)).append(sep)
				.append(calendar.get(Calendar.YEAR)).toString();
	}

	public static String formatPromotion(int promotion) {
		return new StringBuilder().append(promotion).append("/")
				.append(promotion + 1).toString();
	}

}
